home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Rozne / HTTrack 3.40-2 / httrack-3.40-2.exe / {app} / src_win / WinHTTrack / Iplog.cpp < prev    next >
C/C++ Source or Header  |  2004-02-14  |  9KB  |  379 lines

  1. // iplog.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "Shell.h"
  6. #include "iplog.h"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. extern HICON httrack_icon;
  15. extern "C" char* fconcat(char*,char*);
  16.  
  17. // Helper
  18. extern LaunchHelp* HtsHelper;
  19.  
  20. #define LOW_MARK 127000
  21. #define HIGH_MARK 128000
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // Ciplog dialog
  25.  
  26.  
  27. Ciplog::Ciplog(CWnd* pParent /*=NULL*/)
  28.     : CDialog(Ciplog::IDD, pParent)
  29. {
  30.   timer=0;
  31.   txt="\n";
  32.   type=-1;
  33.   type_filter=0;
  34.   filter=0;
  35.     //{{AFX_DATA_INIT(Ciplog)
  36.     m_iplog = _T("");
  37.     //}}AFX_DATA_INIT
  38. }
  39.  
  40.  
  41. void Ciplog::DoDataExchange(CDataExchange* pDX)
  42. {
  43.     CDialog::DoDataExchange(pDX);
  44.     //{{AFX_DATA_MAP(Ciplog)
  45.     DDX_Control(pDX, IDC_HIDEINFO, m_ctl_hideinfo);
  46.     DDX_Control(pDX, IDC_log, m_ctl_iplog);
  47.     DDX_Text(pDX, IDC_log, m_iplog);
  48.     //}}AFX_DATA_MAP
  49. }
  50.  
  51.  
  52. // typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
  53. BEGIN_MESSAGE_MAP(Ciplog, CDialog)
  54.     //{{AFX_MSG_MAP(Ciplog)
  55.     ON_EN_VSCROLL(IDC_log, OnScroll)
  56.     ON_WM_DESTROY()
  57.     ON_WM_SIZE()
  58.     ON_WM_HELPINFO()
  59.     ON_BN_CLICKED(IDC_changelog, Onchangelog)
  60.     ON_WM_TIMER()
  61.     ON_CBN_SELCHANGE(IDC_HIDEINFO, OnSelchangeHideinfo)
  62.     ON_EN_HSCROLL(IDC_log, OnScroll)
  63.     ON_BN_CLICKED(IDC_FIND, OnFind)
  64.     //}}AFX_MSG_MAP
  65.   ON_COMMAND(ID_HELP_FINDER,OnHelpInfo2)
  66.   ON_COMMAND(ID_HELP,OnHelpInfo2)
  67.     ON_COMMAND(ID_DEFAULT_HELP,OnHelpInfo2)
  68.   ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify )
  69. END_MESSAGE_MAP()
  70.  
  71. /////////////////////////////////////////////////////////////////////////////
  72. // Ciplog message handlers
  73.  
  74.  
  75. // refresh
  76. void Ciplog::AffLogRefresh() {
  77.   if (wait_me) {
  78.     wait_me=0;
  79.     return;
  80.   }
  81.   if (type_log != type) {
  82.     type=type_log;
  83.     if (fp)
  84.       fclose(fp);
  85.     fp=NULL;
  86.   }
  87.   if (type_filter != filter) {
  88.     filter=type_filter;
  89.     if (fp)
  90.       fclose(fp);
  91.     fp=NULL;
  92.   }
  93.   
  94.   if (fp==NULL) {
  95.     txt="";
  96.     if (type_log) {
  97.       fp=fopen(fconcat(pathlog,"hts-log.txt"),"rb");
  98.       SetWindowTextCP(this, LANG_E10);
  99.       SetWindowTextCP(m_ctl_iplog, LANG_E10);
  100.       SetDlgItemTextCP(this, IDC_changelog,LANG_E11);
  101.     }
  102.     else {
  103.       fp=fopen(fconcat(pathlog,"hts-err.txt"),"rb");
  104.       SetWindowTextCP(this, LANG_E11);
  105.       SetWindowTextCP(m_ctl_iplog, LANG_E11);
  106.       SetDlgItemTextCP(this, IDC_changelog,LANG_E10);
  107.       if (!fp) {        /* pas de err : switcher (en cas de log unique) */
  108.         type_log=1;
  109.         GetDlgItem(IDC_changelog)->ModifyStyle(0,WS_DISABLED);
  110.       }
  111.     }
  112.     SetDlgItemTextCP(this, IDC_log,txt);
  113.   }
  114.   
  115.   if (fp) {
  116.     char dat[HIGH_MARK+4]; dat[0]='\0';
  117.     clearerr(fp);
  118.     if (!feof(fp)) {
  119.       char* a=dat;
  120.       char* startline=dat;
  121.       int n=0;
  122.       int c;
  123.       while ( (!feof(fp)) && (n<HIGH_MARK) ) {
  124.         c = fgetc(fp);
  125.         n++;
  126.         if ((c>0) && (c!=EOF)) {
  127.           switch(c) {
  128.           case 13: break;
  129.           case 10: {
  130.             *a='\0';
  131.             if (filter & 1) {
  132.               if (strstr(startline,"Debug:")) {       // Θliminer dΘbug
  133.                 a=startline;
  134.               }
  135.             }
  136.             if (filter & 2) {
  137.               if (strstr(startline,"Info:")) {       // Θliminer info
  138.                 a=startline;
  139.               }
  140.             }
  141.             if (a!=startline) {
  142.               *a++=13; 
  143.               *a++=10;
  144.             }
  145.             startline=a;
  146.             /* couper en fin de ligne */
  147.             if (n>=LOW_MARK)
  148.               n=HIGH_MARK;
  149.                    }
  150.             break;
  151.           case 9: *a++=' '; break;
  152.           default:
  153.             *a++=c;
  154.             break;
  155.           }
  156.         }
  157.       }
  158.       *a='\0';
  159.     }
  160.     if (strlen(dat)>0) {
  161.       // avant d'Θcrire on sauvegarde la position (bah oui.. c chiant)
  162.       txt += dat;
  163.       int lh = m_ctl_iplog.GetScrollPos(SB_HORZ);
  164.       int lv = m_ctl_iplog.GetScrollPos(SB_VERT);
  165.       SetDlgItemTextCP(this, IDC_log,txt);
  166.       m_ctl_iplog.SetScrollPos(SB_HORZ,lh);
  167.       m_ctl_iplog.SetScrollPos(SB_VERT,lv);
  168.     }
  169.   }
  170. }
  171.  
  172. BOOL Ciplog::DestroyWindow() 
  173. {
  174.   StopTimer();
  175.   if (fp)
  176.     fclose(fp);
  177.   fp=NULL;
  178.     return CDialog::DestroyWindow();
  179. }
  180.  
  181. void Ciplog::OnScroll() 
  182. {
  183.   wait_me=1;  // attendre pour le scrolling
  184. }
  185.  
  186. BOOL Ciplog::OnInitDialog() 
  187. {
  188.   wait_me=0;
  189.   fp=NULL;
  190.  
  191.     CDialog::OnInitDialog();    
  192.   SetIcon(httrack_icon,false);
  193.   SetIcon(httrack_icon,true);
  194.   EnableToolTips(true);     // TOOL TIPS
  195.   SetForegroundWindow();   // yop en premier plan!
  196.   //m_ctl_iplog.ModifyStyle(WS_DLGFRAME,WS_CAPTION|WS_BORDER);
  197.   ///m_ctl_iplog.ModifyStyle(WS_DLGFRAME,WS_BORDER);
  198.   ///m_ctl_iplog.ModifyStyleEx(0,WS_EX_CLIENTEDGE|WS_EX_DLGMODALFRAME);
  199.   //m_ctl_iplog.SetReadOnly(FALSE);     // en blanc
  200.  
  201.   // Patcher l'interface pour les Franτais ;-)
  202.   if (LANG_T(-1)) {    // Patcher en franτais
  203.     //SetDlgItemTextCP(this, ,"");
  204.     SetDlgItemTextCP(this, IDC_STATIC_type,LANG(LANG_E4)); // "Type d'infos:");
  205.     SetDlgItemTextCP(this, IDC_logtype,LANG(LANG_E5)); // "Erreurs");
  206.     SetDlgItemTextCP(this, IDC_logtype2,LANG(LANG_E6)); // "Infos");
  207.     SetDlgItemTextCP(this, IDC_FIND,LANG(LANG_E7)); // "Find");
  208.     //SetDlgItemTextCP(this, IDOK,LANG(LANG_CLOSE)); // "FERMER");
  209.     SetCombo(this,IDC_HIDEINFO,LISTDEF_2);
  210.   }
  211.  
  212.   // dΘmarrer timer
  213.   StartTimer();
  214.  
  215.     return TRUE;  // return TRUE unless you set the focus to a control
  216.                   // EXCEPTION: OCX Property Pages should return FALSE
  217. }
  218.  
  219. // Resize
  220. void Ciplog::OnSize(UINT nType, int cx, int cy) 
  221. {
  222.   CDialog::OnSize(nType, cx, cy);
  223.  
  224.   HWND ip = ::GetDlgItem(this->m_hWnd,IDC_log);
  225.   if (ip) {
  226.     int w,h;
  227.     RECT rect;
  228.     ::GetWindowRect(ip,&rect);
  229.     // screen coord -> client coord
  230.     POINT a,b;
  231.     a.x=rect.left; a.y=rect.top; b.x=rect.right; b.y=rect.bottom;
  232.     ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b);
  233.     rect.left=a.x; rect.top=a.y; rect.right=b.x; rect.bottom=b.y;
  234.     w = max(cx - rect.left,320);
  235.     h = max(cy - rect.top,200);
  236.     ::SetWindowPos(ip,NULL,0,0,w,h,SWP_NOZORDER|SWP_NOMOVE|SWP_NOOWNERZORDER);
  237.   }
  238. }
  239.  
  240.  
  241. void Ciplog::OnDestroy() 
  242. {
  243.   if (fp) {
  244.     fclose(fp);    
  245.     fp=NULL;
  246.   }
  247.     CDialog::OnDestroy();    
  248. }
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255. // ------------------------------------------------------------
  256. // TOOL TIPS
  257. //
  258. // ajouter dans le .cpp:
  259. // remplacer les deux Wid1:: par le nom de la classe::
  260. // dans la message map, ajouter
  261. // ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify )
  262. // dans initdialog ajouter
  263. // EnableToolTips(true);     // TOOL TIPS
  264. //
  265. // ajouter dans le .h:
  266. // char* GetTip(int id);
  267. // et en generated message map
  268. // afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
  269. BOOL Ciplog::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
  270. {
  271.   TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
  272.   UINT nID =pNMHDR->idFrom;
  273.   if (pTTT->uFlags & TTF_IDISHWND)
  274.   {
  275.     // idFrom is actually the HWND of the tool
  276.     nID = ::GetDlgCtrlID((HWND)nID);
  277.     if(nID)
  278.     {
  279.       char* st=GetTip(nID);
  280.       if (st != "") {
  281.         pTTT->lpszText = st;
  282.         pTTT->hinst = AfxGetResourceHandle();
  283.         return(TRUE);
  284.       }
  285.     }
  286.   }
  287.   return(FALSE);
  288. }
  289. char* Ciplog::GetTip(int ID)
  290. {
  291.   switch(ID) {
  292.     case IDC_logtype:  return LANG(LANG_E1 /*"View error and warning reports"*/); break;
  293.     case IDC_logtype2: return LANG(LANG_E2 /*"View info report"*/); break;
  294.     case IDC_FIND:     return LANG(LANG_E8); break; 
  295.     //case IDOK:         return LANG(LANG_E3 /*"Close the log window"*/); break;
  296.     //case : return ""; break;
  297.   }
  298.   return "";
  299. }
  300. // TOOL TIPS
  301. // ------------------------------------------------------------
  302.  
  303.  
  304. // Appel aide
  305. void Ciplog::OnHelpInfo2() {
  306.   (void) OnHelpInfo(NULL);
  307. }
  308.  
  309. BOOL Ciplog::OnHelpInfo(HELPINFO* dummy) 
  310. {
  311.   //return CDialog::OnHelpInfo(pHelpInfo);
  312.   HtsHelper->Help();
  313.   return true;
  314.   //AfxGetApp()->WinHelp(0,HELP_FINDER);    // Index du fichier Hlp
  315.   //return true;
  316. }
  317.  
  318. void Ciplog::Onchangelog() 
  319. {
  320.   if (type_log)
  321.     type_log=0;
  322.   else
  323.     type_log=1;  
  324. }
  325.  
  326. void Ciplog::OnTimer(UINT nIDEvent) 
  327. {
  328.   AffLogRefresh();
  329.     CDialog::OnTimer(nIDEvent);
  330. }
  331.  
  332. void Ciplog::StartTimer() {
  333.   if (!timer) {
  334.     timer=SetTimer(WM_TIMER,100,NULL);
  335.   }
  336. }
  337. void Ciplog::StopTimer() {
  338.   if (timer) {
  339.     KillTimer(timer);
  340.     timer=0;
  341.   }
  342. }
  343.  
  344. void Ciplog::OnSelchangeHideinfo() 
  345. {
  346.   int r=m_ctl_hideinfo.GetCurSel();
  347.   switch(r) {
  348.   case CB_ERR : break;  // pas de sΘlection
  349.   default:
  350.     type_filter=r;
  351.   break;
  352.   }
  353. }
  354.  
  355. void Ciplog::OnFind() 
  356. {
  357.   CWaitCursor wait;
  358.   CString find;
  359.   GetDlgItemText(IDC_FINDSTR,find);
  360.   find.MakeLower();
  361.   if (find.GetLength()) {
  362.     CString data;
  363.     GetDlgItemText(IDC_log,data);
  364.     data.MakeLower();
  365.     int pos=data.Find(find);
  366.     if (pos>=0) {
  367.       //m_ctl_iplog.SetScrollPos(SB_VERT,m_ctl_iplog.LineFromChar(pos));
  368.       m_ctl_iplog.Clear();
  369.       //m_ctl_iplog.SetSel(pos,pos+100);
  370.       m_ctl_iplog.SendMessage(EM_SETSEL,0,pos);
  371.       m_ctl_iplog.SendMessage(EM_EXSETSEL,0,(LPARAM) (CHARRANGE FAR *) pos);
  372.       m_ctl_iplog.SendMessage(EM_SCROLLCARET,0,0);
  373.       m_ctl_iplog.SendMessage(EM_SETSEL,-1,-1);
  374.  
  375.       //m_ctl_iplog.RedrawWindow();
  376.     }
  377.   }
  378. }
  379.